package rohyunji;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class J02_Departments {

	/*
	  1.JDBC드라이버 불러오기
	  JDBC드라이버는 데이터베이스에 연결해야할 필요가 있는 자바클래스와 JDBC드라이버 사이의 계약을 정의하는 인터페이스들을 구현한것
	    드라이버는 jar파일 형태로 배포
	  JDBC 드라이버를 불러오는 방법에는 수동 manual 과 동적dynamic 이 있음
	  Class.forName("oracle.jdbc.driver.OracleDriver"); = Class.forName(DRV);
	  
	  forName 메서드는 ClassNotFoundException예외를 던지기 떄문에 try-catch블럭안에 둬야함
	  
	 2.데이터베이스 연결하기
	 Connection 인터페이스는 데이터베이스 연결객체를 위한 그릇(템플릿)임 
	  연결객체를 얻으려면 DriverManager클래스의 getConnection 메서드 이용
	 getConnection 메서드는 앞의 과정에서 메모리에 올려둔 드라이버를 찾고 URL,USR,PWD를 통해 데이터베이스 서버에 연결을하고
	  그결과를 Connerction으로 반환
	  
	  JDBC연결시 사용하는 URL을 다음과 같음  
	  jdbc :프로토콜: 하위이름
	  jdbc :oracle:thin:@주소:포트:DB이름?user=아이디&password=비밀번호
	  jdbc:mysql://주소/db이름?user=아이디&password=비밀번호
	  
	3.SQL질의문 생성 및 실행
	Statement,PreparedStatement 메서드를  이용해서 위 객체를 얻을수 있음
	단 , 위 메서드를 호출할때는 생성할 SQL 질의문을 인자로 전달해야함 생성한 객체를 생성하려면 executeQuery나 
	executeUpdate 메서드를 이용(insert,update,delete,create,alter,drop)
	executeQuery SQL질의문이 select인경우 
	
	executeUpdate 의 실행결과는 질의문에 의해 변경된 레코드 수나 0을 반환
	
	executeQuery의 실행결과는 질의문에의해 변경된 레코드 수나 0을 반환
	executeQuery의 실행결과는 질의문에의해 생선된 데이터를 담아두는 ResultSet객체를 반환
	단,생성된 데이터가 없는경우 null반환
	
	Statement에서 파생된 PreparedStatement는  Statement 의 인기있는 대체제임 
	SQL문은 미리 컴파일하고 저장해두기 때문에 주로 동일한 SQL문을 실행할경우 빠르게 저장된다는 장점이있음
	
	4.결과집합 ResultSet객체 다루기
	결과집합은 Statement,PreparedStatement에서 반환된 데이터베이스 테이블을 의미함 
	결과집합 객체는 현재 데이터행을 가리키는 커서를 가지고있음 !
	커서는 처음에는 테이블을 가지고 있다가 next메서드가 호출되면 첫번째 레코드로 접근함
	true가 반환되면 현재 레코드가 존재한다는 의미
	false 반환되면 더이상 레코드가 없다는 의미 
	while을 이용해서 모든 레코드에 접근할수 있음 
	
	next메서드로 레코드에 접근한 뒤 , 각 필드 값을 가져오려면 getXXX 메서드를 사용해야함
	일반적으로 필드값을 문자열로 가져오는 getString 메서드를 많이사용 
	필드값을 int로 가져오려면 getInt를 사용하면 됨
	
	필드값은 필드이름 또는 필드 위치만을 인자로 전달해서 필드값을 가져올수 있음
	getString (1)
	getString("department_id")
	
	5. JDBC 객체 닫기
	모든 JDBC 객체는 사용한후 그룹의 close객체도 호출해서 항상 닫아야함
	어떻게?잘 ㅋ
	if(rs!=null)
			{
				try{rs.close(); rs=null;}
				catch(Exception e){}
			}
			if(pstmt!=null)
			{
				try{rs.close(); pstmt=null;}
				catch(Exception e){}
			}
			if(conn!=null)
			{
				try{rs.close(); conn=null;}
				catch(Exception e){}
			}
	
	  finally에 담아라 !
	
	 */
	public static void main(String[] args) 
	{
		// TODO Auto-generated method stub
		
		final String DRV="oracle.jdbc.driver.OracleDriver";
		final String URL="jdbc:oracle:thin:@112.216.253.125:1521:xe";
		final String USR="rohji";
		final String PWD="rohji";
		
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		String sql="select *from departments";
		
		try {
				
				Class.forName(DRV);
				
				conn=DriverManager.getConnection(URL,USR,PWD);
				
//				
				pstmt=conn.prepareStatement(sql);
				rs=pstmt.executeQuery();
				
				if(rs.next())
				{
					do{
					System.out.println(rs.getString(1));
					}while(rs.next());
				}
				else System.out.println("없엉");
				

			}
	 catch (Exception e) {e.printStackTrace();}
		finally{
			if(rs!=null)
			{
				try{rs.close(); rs=null;}
				catch(Exception e){}
			}
			if(pstmt!=null)
			{
				try{rs.close(); pstmt=null;}
				catch(Exception e){}
			}
			if(conn!=null)
			{
				try{rs.close(); conn=null;}
				catch(Exception e){}
			}
		}
		

	}

}
